<?php
class Zen_Cache
{

	protected $cacheFinded = false;

	protected $cache = false;

	protected $clean = false;

	protected $path;

	protected $file;

	public function __construct($settings)
	{
		$params = parse_ini_file($settings);
		if ($params['cache.on'] == true)
			$this->cache = true;
		if ($params['cache.clean.on'] == true)
			$this->clean = true;
		$this->path = ROOT_PATH."/site/cache/pages";
		if(!file_exists($this->path)){
			mkdir($this->path,0777,true);
		}
	}

	public function start()
	{    
	   
		if (($this->cache == true)&&($_SERVER['REQUEST_METHOD']=='GET'))
		{
		    $this->file = $this->path . $_SERVER['REQUEST_URI'];
		    
		    
		    
			if (
				(!preg_match('/^\\/backend\\//ui', $_SERVER['REQUEST_URI']))&&
			    (!preg_match('/^\\/admin\\//ui', $_SERVER['REQUEST_URI']))&&
			    (!preg_match('/^\\/admin/ui', $_SERVER['REQUEST_URI']))&&
			    (!preg_match('/^\\/user\\//ui', $_SERVER['REQUEST_URI']))&&
				(!preg_match('/\\?/ui', $_SERVER['REQUEST_URI']))
				)
			{
				
				
				if ($_SERVER['REQUEST_URI'] == '/')
				{
					$this->file = $this->file . 'index.html';
				} else
				{
					preg_match('/\S+\.(\S+)$/', $_SERVER['REQUEST_URI'], $out);
					if (!isset($out[1]))
					{
						$this->file = preg_replace('/\\/$/', '', $this->file) . '/index.html';
					
					}
				}
				if (file_exists($this->file))
				{
					echo file_get_contents($this->file);
					exit();
				}
				$this->cacheFinded = true;
				if ($this->cacheFinded == true)
					ob_start();
			}
		}
	}

	public function end()
	{
		if ($this->cache == true)
		{
			if ($this->cacheFinded == true)
			{
				$dir = preg_replace('/\w+\.\w+$/', '', $this->file);
				if (! file_exists($dir))
				{
					mkdir($dir, 0777, true);
				}
				$handle = fopen($this->file, "w+");
				
				$text = ob_get_contents();
				if ($this->clean == true)
				{
					//Удаление комментариев
				    $text = preg_replace('/<!--.*-->/Uis', '', $text);
				    $text = str_replace(array(
						"\r\n", 
						"\r", 
						"\n", 
						"\t"), '', $text);
				    $text = preg_replace('/\040+/ui',' ', $text);
				    $text = str_replace(array("> <"), '><', $text);
					
				}
				
				fwrite($handle, $text);
				fclose($handle);
				ob_end_flush();
				/*
				$new_url=$_SERVER['REQUEST_URI'];
				header("Location: $new_url");
				*/ 
			}
		}
	}

	
	
private function recursive_remove_directory($directory, $empty=FALSE)
{
	// if the path has a slash at the end we remove it here
	if(substr($directory,-1) == '/')
	{
		$directory = substr($directory,0,-1);
	}

	// if the path is not valid or is not a directory ...
	if(!file_exists($directory) || !is_dir($directory))
	{
		// ... we return false and exit the function
		return FALSE;

	// ... if the path is not readable
	}elseif(!is_readable($directory))
	{
		// ... we return false and exit the function
		return FALSE;

	// ... else if the path is readable
	}else{

		// we open the directory
		$handle = opendir($directory);

		// and scan through the items inside
		while (FALSE !== ($item = readdir($handle)))
		{
			// if the filepointer is not the current directory
			// or the parent directory
			if($item != '.' && $item != '..')
			{
				// we build the new path to delete
				$path = $directory.'/'.$item;

				// if the new path is a directory
				if(is_dir($path)) 
				{
					// we call this function with the new path
					$this->recursive_remove_directory($path);

				// if the new path is a file
				}else{
					// we remove the file
					unlink($path);
				}
			}
		}
		// close the directory
		closedir($handle);

		// if the option to empty is not set to true
		if($empty == FALSE)
		{
			// try to delete the now empty directory
			if(!rmdir($directory))
			{
				// return false if not possible
				return FALSE;
			}
		}
		// return success
		return TRUE;
	}
}
}